/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

package org.apache.airavata.metcat.parser.impl;

import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.airavata.metcat.db.workflowmodel.WorkflowEvents;
import org.apache.airavata.metcat.parser.EventNotificationParser;
import org.apache.airavata.metcat.parser.IndexAttribute;
import org.apache.airavata.metcat.parser.xpaths.BaseNotificationTypes;
import org.w3c.dom.Document;

public abstract class ProvenanceBasicParser extends EventNotificationParser {

	private String elementName = null;
	protected WorkflowEvents wfEvents = new WorkflowEvents();
	
	public ProvenanceBasicParser() {
		
	}
	
	public ProvenanceBasicParser(String elementName) {
		this.elementName = elementName;
	}
	
	@Override
	public void refreshCache() {
		List<IndexAttribute> xpaths = new BaseNotificationTypes().getXPaths();
		
		for (IndexAttribute attr : xpaths) {
			attr.setXPath("//" + this.elementName + attr.getXPath());
		}
		
		if (this.metadataIndices == null) {
			this.metadataIndices = new HashMap<String, List<IndexAttribute>>();
		}
		
		this.metadataIndices.put("wor", xpaths);
	}
	
	@Override
	public Map<String, String> filterAndStore(Document source) throws Exception {
		return this.parseEventNotification(source);
	}
	
	protected String toXMLString(Document doc) {
		try {
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			StreamResult result = new StreamResult(new StringWriter());
			DOMSource source = new DOMSource(doc);
			transformer.transform(source, result);
			return result.getWriter().toString();
		} catch (Exception ex) {
			return null;
		}
	}

}
